import { LogicItem, Trigger } from "@/views/form/logic/types";
import { ref, watch } from "vue";
interface OptionShowLogic {
  [key: string]: boolean;
}

interface CheckOptionLogic {
  [key: string]: any[];
}

export function useFormOptionLogic() {
  // 被隐的选项 存储key为题目id+选项id值 值为false或者true 为true表示隐藏 为false表示显示 不存在也可以显示
  const logicOptionHides = ref<OptionShowLogic>({});

  // 选中逻辑规则 存储key为题目id+选项id值 值为数组 数组中为选中选项的值
  const optionCheckIdRule = ref<CheckOptionLogic>({});

  // 读取逻辑 生成逻辑规则
  const initOptionLogic = (logicConfig: LogicItem[]) => {
    //找到类型为showOption的触发器
    logicConfig.forEach((item: LogicItem) => {
      item.triggerList.forEach((trigger: Trigger) => {
        if (trigger.type === "showOption") {
          // 获取选项 是一个数组
          const optionValue = trigger.optionValue;
          if (optionValue) {
            optionValue.forEach((option: string[]) => {
              // 存储选项的key
              logicOptionHides.value[option.join("_")] = true;
            });
          }
        } else if (trigger.type === "checkOption") {
          // 获取选项 是一个数组
          const optionValue = trigger.optionValue;
          if (optionValue) {
            // optionvalue是级联选中的选项 为二维数组 第一项是题目id 第二项是选项id
            optionValue.forEach((option: string[]) => {
              if (option) {
                // 初始化标记
                optionCheckIdRule.value[option[0]] = [];
              }
            });
          }
        }
      });
    });
  };

  /**
   * 设置选项显示状态
   * @param value 选项列表
   * @param flag 逻辑是否成立 成立的话设置为false 表示显示 不成立的话设置为true 表示隐藏
   */
  const setOptionShowStatus = (value: any[], flag: boolean) => {
    if (value) {
      value.forEach((option: string[]) => {
        // 存储选项的key
        logicOptionHides.value[option.join("_")] = !flag;
      });
    }
  };

  /**
   * 设置选项选中状态
   * @param value 选项列表
   * @param flag 逻辑是否成立 成立的话设置为false 表示显示 不成立的话设置为true 表示隐藏
   */
  const setOptionCheckStatus = (value: any[], flag: boolean) => {
    if (value && flag) {
      let selectMap: CheckOptionLogic = {};
      value.forEach((option: string[]) => {
        if (option) {
          if (selectMap[option[0]]) {
            selectMap[option[0]].push(option[1]);
          } else {
            selectMap[option[0]] = [option[1]];
          }
        }
      });
      Object.keys(selectMap).forEach((key: string) => {
        optionCheckIdRule.value[key] = selectMap[key];
      });
    }
  };

  const isShowOption = (id: string) => {
    return logicOptionHides.value[id] === undefined ? true : !logicOptionHides.value[id];
  };

  const initWatchCheckRule = (key: string, callback: Function) => {
    if (undefined !== optionCheckIdRule.value[key]) {
      watch(
        () => optionCheckIdRule.value[key],
        (val: any) => {
          if (val.length) {
            callback(val);
          }
        },
        {
          deep: true
        }
      );
    }
  };

  return {
    initOptionLogic,
    setOptionShowStatus,
    setOptionCheckStatus,
    optionCheckIdRule,
    isShowOption,
    initWatchCheckRule
  };
}

export const formOptionLogicHook = useFormOptionLogic();
